<?php
class ArrayTools{
    /**
     * 去一个二维数组中的每个数组的固定的键知道的值来形成一个新的一维数组
     * @param $pArray 一个二维数组
     * @param $pKey 数组的键的名称
     * @return 返回新的一维数组
     */
    public static function getSubByKey($pArray, $pKey="", $pCondition=""){
        $result = array();
        foreach($pArray as $temp_array){
        	if(is_object($temp_array)){
        		$temp_array = (array) $temp_array;
        	}
            if((""!=$pCondition && $temp_array[$pCondition[0]]==$pCondition[1]) || ""==$pCondition) {
                $result[] = (""==$pKey) ? $temp_array : isset($temp_array[$pKey]) ? $temp_array[$pKey] : "";
            }
        }
        return $result;
    }
    
   /**
     * 以数组中的一个字段的值为唯一索引返回一个三维数组
     * @param $pArray 一个二维数组
     * @param $pFieldBy 作为索引的字段的KEY值
     * @param $pIncludeFileld 可以定义返回的数组的包含的原数组的字段
     * @return 返回新的三维数组
     */
    public static function group($pArray, $pFieldBy, $pIncludeFileld=""){
        if($pIncludeFileld!="")
            $fields = explode(",", $pIncludeFileld);
        $result_array = array();
        
        for($i=0; $i<count($pArray); $i++){
            $group_key = $pArray[$i][$pFieldBy];
            if( !isset( $result_array[$group_key] ) ){
                $result_array[$group_key] = array();
            }

            if($pIncludeFileld!=""){
                $temp = array();
                foreach($fields as $field){
                    $temp[$field] = $pArray[$i][$field];
                }
                $result_array[$group_key][] = $temp;
            }else{
                $result_array[$group_key][] = $pArray[$i];
            }
        }
        return $result_array;
    }
    
    /**
     * 将两个二维数组根据指定的字段来连接起来，连接的方式类似sql查询中的连接
     * @author 常伟
     * @createTime 2004-07-15
     * @param $pArray1 一个二维数组
     * @param $pArray2 一个二维数组
     * @param $pFields 作为连接依据的字段
     * @param $pType 连接的方式，默认为左联，即在右面的数组中没有找到匹配的则对应左面的行，否则不对应
     * @return 连接好的数组
     */
    public static function join($pArray1, $pArray2, $pFields, $pType="left"){
        $result = array();
        foreach($pArray1 as $row1)
        {
            $is_join = false;
            foreach($pArray2 as $row2)
            {
                if(self::canJoin($row1, $row2, $pFields))
                {
                    $result[] = array_merge($row2, $row1);
                    $is_join = true;
                    break;
                }
            }

            //如果是左连接并且没有找到匹配的连接
            if($is_join==false && $pType=="left")
            {
                $result[] = $row1;
            }
        }
        return $result;
    }

    /**
     * 判断两个行是否满足连接条件
     * @author 常伟
     * @createTime 2004-07-15
     * @param $pRow1 数组的一行
     * @param $pRow2 数组的一行
     * @param $pFields 作为连接依据的字段
     * @return 是否可以连接
     */
    private static function canJoin($pRow1, $pRow2, $pFields)
    {
        $field_array = explode(",", $pFields);
        foreach($field_array as $key)
        {
            if($pRow1[$key]!=$pRow2[$key])
                return false;
        }
        return true;
    }

    
    public static function Array2String($pArray, $pKey, $pSplit=",", $pIncludeNull=true){
        $sub_array = self::getSubByKey($pArray, $pKey);
        //print_r($sub_array);
        if($pIncludeNull==true){
            for($i=0; $i<count($sub_array); $i++){
                $sub_array[$i] = trim($sub_array[$i])=="" ? "NULL" : $sub_array[$i];
            }
        }
        return implode($pSplit, $sub_array);
    }
    
    /**
     * 根据指定的键对数组排序
     *
     * 用法：
     * @code php
     * $rows = array(
     *     array('id' => 1, 'value' => '1-1', 'parent' => 1),
     *     array('id' => 2, 'value' => '2-1', 'parent' => 1),
     *     array('id' => 3, 'value' => '3-1', 'parent' => 1),
     *     array('id' => 4, 'value' => '4-1', 'parent' => 2),
     *     array('id' => 5, 'value' => '5-1', 'parent' => 2),
     *     array('id' => 6, 'value' => '6-1', 'parent' => 3),
     * );
     *
     * $rows = Helper_Array::sortByCol($rows, 'id', SORT_DESC);
     * dump($rows);
     * // 输出结果为：
     * // array(
     * //   array('id' => 6, 'value' => '6-1', 'parent' => 3),
     * //   array('id' => 5, 'value' => '5-1', 'parent' => 2),
     * //   array('id' => 4, 'value' => '4-1', 'parent' => 2),
     * //   array('id' => 3, 'value' => '3-1', 'parent' => 1),
     * //   array('id' => 2, 'value' => '2-1', 'parent' => 1),
     * //   array('id' => 1, 'value' => '1-1', 'parent' => 1),
     * // )
     * @endcode
     *
     * @param array $array 要排序的数组
     * @param string $keyname 排序的键
     * @param int $dir 排序方向
     *
     * @return array 排序后的数组
     */
    public static function sortByCol($array, $keyname, $dir = SORT_ASC)
    {
        return self::sortByMultiCols($array, array($keyname => $dir));
    }

    /**
     * 将一个二维数组按照多个列进行排序，类似 SQL 语句中的 ORDER BY
     *
     * 用法：
     * @code php
     * $rows = Helper_Array::sortByMultiCols($rows, array(
     *     'parent' => SORT_ASC, 
     *     'name' => SORT_DESC,
     * ));
     * @endcode
     *
     * @param array $rowset 要排序的数组
     * @param array $args 排序的键
     *
     * @return array 排序后的数组
     */
    public static function sortByMultiCols($rowset, $args)
    {
        $sortArray = array();
        $sortRule = '';
        foreach ($args as $sortField => $sortDir) 
        {
            foreach ($rowset as $offset => $row) 
            {
                $sortArray[$sortField][$offset] = $row[$sortField];
            }
            $sortRule .= '$sortArray[\'' . $sortField . '\'], ' . $sortDir . ', ';
        }
        if (empty($sortArray) || empty($sortRule)) { return $rowset; }
        eval('array_multisort(' . $sortRule . '$rowset);');
        return $rowset;
    }
    
    public static function arrayAllTrue($array){
    	return count($array) == count(array_filter($array));
    }
    
    public static function magicVar($string){
    	return is_array($string)?array('in',$string):$string;
    }
    
   /**
     * mergeArray
     * 迭代合并数组
     * <code>
     * $a = array( "a"=>"123","b"=>"321", "c"=>array( "ddd"=>"d","ccc"=>"d" ) );
     * $b = array( "c"=>array( "123"=>"123123123","333"=>"dsfsdfsdf" ),"d"=>"444" );
     * var_dump( mergeOptions( $a,$b ) );
     * </code>
     * @param array $array1
     * @param mixed $array2
     * @access public
     * @return void
     */
    public static function mergeArray(array $array1,$array2 = null  ){
        if ( is_array( $array1 ) ){
            foreach( $array2 as $key => $val ){
                if (is_array( $val )) {
                    $array1[$key] = ( array_key_exists( $key,$array1 ) && is_array( $array1[$key] ) )? self::mergeArray( $array1[$key],$val ) : $array2[$key] ;
                }else{
                    $array1[$key] = $val;
                }
            }
        }
        return $array1;
    }
    

    
}